﻿using Common.Library.Helper;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;

namespace Clinent.Main.DataModel
{
    /// <summary>
    /// SqlServer数据库过滤器数据模型
    /// </summary>
    [DataContract]
    public class SqlServerProfilterDataModel
    {
        #region 属性
        /// <summary>
        /// Transact-SQL 批处理的文本。
        /// </summary>
        [DataMember(Order = 0, Name = "TextData")]
        public string TextData { get; set; }

        /// <summary>
        /// 与在跟踪中捕获的事件类相关的二进制值 MSDN上的解释是一个图像
        /// </summary>
        [DataMember(Order = 1, Name = "BinaryData")]
        public string BinaryData { get; set; }

        /// <summary>
        /// <para>由 USE database 语句指定的数据库的 ID；</para>
        /// <para>如果未对给定实例发出 USE database 语句，则为默认数据库的 ID。 </para>
        /// <para>SQL Server Profiler 如果在跟踪中捕获 ServerName 数据列而且服务器可用，则将显示数据库名。 可使用 DB_ID 函数来确定数据库的值。</para>
        /// </summary>
        [DataMember(Order = 2, Name = "DatabaseID")]
        public int? DatabaseID { get; set; }

        /// <summary>
        /// 系统分配的事务 ID。
        /// </summary>
        [DataMember(Order = 3, Name = "TransactionID")]
        public long? TransactionID { get; set; }

        /// <summary>
        /// Windows 用户名。
        /// </summary>
        [DataMember(Order = 4, Name = "NTUserName")]
        public string NTUserName { get; set; }

        /// <summary>
        /// 用户所属的 Windows 域。
        /// </summary>
        [DataMember(Order = 5, Name = "NTDomainName")]
        public string NTDomainName { get; set; }

        /// <summary>
        /// 正在运行客户端的计算机的名称。 如果客户端提供了主机名，则填充此数据列。 若要确定主机名，请使用 HOST_NAME 函数。
        /// </summary>
        [DataMember(Order = 6, Name = "HostName")]
        public string HostName { get; set; }

        /// <summary>
        /// 主机为运行该客户端应用程序的进程分配的 ID。 如果客户端提供了客户端进程 ID，则填充此数据列。
        /// </summary>
        [DataMember(Order = 7, Name = "ClientProcessID")]
        public int? ClientProcessID { get; set; }

        /// <summary>
        /// 客户端应用程序的名称，该客户端应用程序创建了指向 SQL Server实例的连接。 此列由应用程序传递的值填充，而不是由所显示的程序名填充。
        /// </summary>
        [DataMember(Order = 8, Name = "ApplicationName")]
        public string ApplicationName { get; set; }

        /// <summary>
        /// 用户的登录名（ SQL Server 安全登录名或 Microsoft Windows 登录凭据，格式为“DOMAIN\username”）。
        /// </summary>
        [DataMember(Order = 9, Name = "LoginName")]
        public string LoginName { get; set; }

        /// <summary>
        /// 发生该事件的会话的 ID。
        /// </summary>
        [DataMember(Order = 10, Name = "SPID")]
        public int? SPID { get; set; }

        /// <summary>
        /// 事件占用的时间（微秒）。
        /// </summary>
        [DataMember(Order = 11, Name = "Duration")]
        public long? Duration { get; set; }

        /// <summary>
        /// 该事件（如果存在）的启动时间。
        /// </summary>
        [DataMember(Order = 12, Name = "StartTime")]
        public DateTime? StartTime { get; set; }

        /// <summary>
        /// 事件结束的时间。 对指示事件开始的事件类（例如 SQL:BatchStarting 或 SP:Starting）将不填充此列。
        /// </summary>
        [DataMember(Order = 13, Name = "EndTime")]
        public DateTime? EndTime { get; set; }

        /// <summary>
        /// 批处理导致的页读取 I/O 数。
        /// </summary>
        [DataMember(Order = 14, Name = "Reads")]
        public long? Reads { get; set; }

        /// <summary>
        /// 批处理导致的页写入 I/O 数。
        /// </summary>
        [DataMember(Order = 15, Name = "Writes")]
        public long? Writes { get; set; }

        /// <summary>
        /// 批处理使用的 CPU 时间（毫秒）。
        /// </summary>
        [DataMember(Order = 16, Name = "CPU")]
        public int? CPU { get; set; }

        /// <summary>
        /// 系统分配的对象标识符，包含引起重新编译的语句。
        /// <para>此对象可以是存储过程、触发器或用户定义函数。 对于即席批查询或已准备好的 SQL，ObjectID 和 ObjectName 将返回一个 NULL 值。</para>
        /// </summary>
        [DataMember(Order = 17, Name = "ObjectID")]
        public int? ObjectID { get; set; }

        /// <summary>
        /// 正在跟踪的 SQL Server 的名称。
        /// </summary>
        [DataMember(Order = 18, Name = "ServerName")]
        public string ServerName { get; set; }

        /// <summary>
        /// 事件类型
        /// </summary>
        [DataMember(Order = 19, Name = "EventClass")]
        public int? EventClass { get; set; }

        /// <summary>
        /// 登录用户的安全标识号 (SID)。 您可以在 sys.server_principals 目录视图中找到此信息。 服务器中的每个登录名都具有唯一的 SID。 MSDN上解释该类型为一个iamge类型
        /// </summary>
        [DataMember(Order = 20, Name = "LoginSID")]
        public string LoginSID { get; set; }

        /// <summary>
        /// 连接提供程序的名称（例如“MSSQL”）
        /// </summary>
        [DataMember(Order = 21, Name = "ProviderName")]
        public string ProviderName { get; set; }
        #endregion

        /// <summary>
        /// DataRow转DataModel
        /// </summary>
        /// <param name="row"></param>
        /// <returns></returns>
        public static SqlServerProfilterDataModel DataRowToDataModel(DataRow row)
        {
            SqlServerProfilterDataModel dataModel = new SqlServerProfilterDataModel();
            if(row != null)
            {
                dataModel.TextData = ValueTypeConvertHelper.ToString(ValueTypeConvertHelper.DataRowToObject(row, "TextData"));
                dataModel.BinaryData = ValueTypeConvertHelper.ToString(ValueTypeConvertHelper.DataRowToObject(row, "BinaryData"));
                dataModel.DatabaseID = ValueTypeConvertHelper.ToNullable<int>(ValueTypeConvertHelper.DataRowToObject(row, "DatabaseID",null));
                dataModel.TransactionID = ValueTypeConvertHelper.ToNullable<int>(ValueTypeConvertHelper.DataRowToObject(row, "TransactionID",null));
                dataModel.NTUserName = ValueTypeConvertHelper.ToString(ValueTypeConvertHelper.DataRowToObject(row, "NTUserName"));
                dataModel.NTDomainName = ValueTypeConvertHelper.ToString(ValueTypeConvertHelper.DataRowToObject(row, "NTDomainName"));
                dataModel.HostName = ValueTypeConvertHelper.ToString(ValueTypeConvertHelper.DataRowToObject(row, "HostName"));
                dataModel.ClientProcessID = ValueTypeConvertHelper.ToNullable<int>(ValueTypeConvertHelper.DataRowToObject(row, "ClientProcessID",null));
                dataModel.ApplicationName = ValueTypeConvertHelper.ToString(ValueTypeConvertHelper.DataRowToObject(row, "ApplicationName"));
                dataModel.LoginName = ValueTypeConvertHelper.ToString(ValueTypeConvertHelper.DataRowToObject(row, "LoginName"));
                dataModel.SPID = ValueTypeConvertHelper.ToNullable<int>(ValueTypeConvertHelper.DataRowToObject(row, "SPID",null));
                dataModel.Duration = ValueTypeConvertHelper.ToNullable<long>(ValueTypeConvertHelper.DataRowToObject(row, "Duration",null));
                dataModel.StartTime = ValueTypeConvertHelper.ToNullable<DateTime>(ValueTypeConvertHelper.DataRowToObject(row, "StartTime",null));
                dataModel.EndTime = ValueTypeConvertHelper.ToNullable<DateTime>(ValueTypeConvertHelper.DataRowToObject(row, "EndTime",null));
                dataModel.Reads = ValueTypeConvertHelper.ToNullable<long>(ValueTypeConvertHelper.DataRowToObject(row, "Reads",null));
                dataModel.Writes = ValueTypeConvertHelper.ToNullable<long>(ValueTypeConvertHelper.DataRowToObject(row, "Writes",null));
                dataModel.CPU = ValueTypeConvertHelper.ToNullable<int>(ValueTypeConvertHelper.DataRowToObject(row, "CPU",null));
                dataModel.ObjectID = ValueTypeConvertHelper.ToNullable<int>(ValueTypeConvertHelper.DataRowToObject(row, "ObjectID",null));
                dataModel.ServerName = ValueTypeConvertHelper.ToString(ValueTypeConvertHelper.DataRowToObject(row, "ServerName"));
                dataModel.EventClass = ValueTypeConvertHelper.ToNullable<int>(ValueTypeConvertHelper.DataRowToObject(row, "EventClass",null));
                dataModel.LoginSID = ValueTypeConvertHelper.ToString(ValueTypeConvertHelper.DataRowToObject(row, "LoginSID"));
                dataModel.ProviderName = ValueTypeConvertHelper.ToString(ValueTypeConvertHelper.DataRowToObject(row, "ProviderName"));
            }
            return dataModel;
        }

        public override string ToString()
        {
            StringBuilder sb = new StringBuilder(); 
            sb.AppendLine($" TextData : {TextData} ");
            sb.AppendLine($" BinaryData : {BinaryData} ");
            sb.AppendLine($" DatabaseID : {DatabaseID} ");
            sb.AppendLine($" TransactionID : {TransactionID} ");
            sb.AppendLine($" NTUserName : {NTUserName} ");
            sb.AppendLine($" NTDomainName : {NTDomainName} ");
            sb.AppendLine($" HostName : {HostName} ");
            sb.AppendLine($" ClientProcessID : {ClientProcessID} ");
            sb.AppendLine($" ApplicationName : {ApplicationName} ");
            sb.AppendLine($" LoginName : {LoginName} ");
            sb.AppendLine($" SPID : {SPID} ");
            sb.AppendLine($" Duration : {Duration} ");
            sb.AppendLine($" StartTime : {StartTime} ");
            sb.AppendLine($" EndTime : {EndTime} ");
            sb.AppendLine($" Reads : {Reads} ");
            sb.AppendLine($" Writes : {Writes} ");
            sb.AppendLine($" CPU : {CPU} ");
            sb.AppendLine($" ObjectID : {ObjectID} ");
            sb.AppendLine($" ServerName : {ServerName} ");
            sb.AppendLine($" EventClass : {EventClass} ");
            sb.AppendLine($" LoginSID : {LoginSID} ");
            sb.AppendLine($" ProviderName : {ProviderName} ");
            return sb.ToString();
        }

    }
}
